@@ -170,7 +170,7 @@ $(document).ready -> |
||
| 170 | 170 |
else |
| 171 | 171 |
hideLinks() |
| 172 | 172 |
|
| 173 |
- if json.can_run_other_agents |
|
| 173 |
+ if json.can_control_other_agents |
|
| 174 | 174 |
showChains() |
| 175 | 175 |
else |
| 176 | 176 |
hideChains() |
@@ -206,7 +206,7 @@ $(document).ready -> |
||
| 206 | 206 |
hideLinks() |
| 207 | 207 |
|
| 208 | 208 |
if $(".chain-region")
|
| 209 |
- if $(".chain-region").data("can-run-other-agents") == true
|
|
| 209 |
+ if $(".chain-region").data("can-control-other-agents") == true
|
|
| 210 | 210 |
showChains() |
| 211 | 211 |
else |
| 212 | 212 |
hideChains() |
@@ -0,0 +1,27 @@ |
||
| 1 |
+module AgentControllerConcern |
|
| 2 |
+ extend ActiveSupport::Concern |
|
| 3 |
+ |
|
| 4 |
+ def default_options |
|
| 5 |
+ {
|
|
| 6 |
+ 'action' => 'run', |
|
| 7 |
+ } |
|
| 8 |
+ end |
|
| 9 |
+ |
|
| 10 |
+ def control_action |
|
| 11 |
+ options['action'] || 'run' |
|
| 12 |
+ end |
|
| 13 |
+ |
|
| 14 |
+ def control_targets! |
|
| 15 |
+ targets.active.each { |target|
|
|
| 16 |
+ begin |
|
| 17 |
+ case control_action |
|
| 18 |
+ when 'run' |
|
| 19 |
+ log "Agent run queued for '#{target.name}'"
|
|
| 20 |
+ Agent.async_check(target.id) |
|
| 21 |
+ end |
|
| 22 |
+ rescue => e |
|
| 23 |
+ log "Failed to #{control_action} '#{target.name}': #{e.message}"
|
|
| 24 |
+ end |
|
| 25 |
+ } |
|
| 26 |
+ end |
|
| 27 |
+end |
@@ -19,10 +19,10 @@ module AgentHelper |
||
| 19 | 19 |
def agent_schedule(agent, delimiter = ', ') |
| 20 | 20 |
return 'n/a' unless agent.can_be_scheduled? |
| 21 | 21 |
|
| 22 |
- runners = agent.runners |
|
| 22 |
+ controllers = agent.controllers |
|
| 23 | 23 |
[ |
| 24 |
- *(CGI.escape_html(agent.schedule.humanize.titleize) unless agent.schedule == 'never' && agent.runners.count > 0), |
|
| 25 |
- *runners.map { |agent| link_to(agent.name, agent_path(agent)) },
|
|
| 24 |
+ *(CGI.escape_html(agent.schedule.humanize.titleize) unless agent.schedule == 'never' && agent.controllers.count > 0), |
|
| 25 |
+ *controllers.map { |agent| link_to(agent.name, agent_path(agent)) },
|
|
| 26 | 26 |
].join(delimiter).html_safe |
| 27 | 27 |
end |
| 28 | 28 |
end |
@@ -138,9 +138,9 @@ module DotHelper |
||
| 138 | 138 |
def agent_edge(agent, receiver) |
| 139 | 139 |
edge(agent_id[agent], |
| 140 | 140 |
agent_id[receiver], |
| 141 |
- style: ('dashed' unless agent.can_run_other_agents? || !receiver.propagate_immediately?),
|
|
| 142 |
- label: (' runs ' if agent.can_run_other_agents?),
|
|
| 143 |
- arrowhead: ('empty' if agent.can_run_other_agents?),
|
|
| 141 |
+ style: ('dashed' unless agent.can_control_other_agents? || !receiver.propagate_immediately?),
|
|
| 142 |
+ label: (" #{agent.control_action}s " if agent.can_control_other_agents?),
|
|
| 143 |
+ arrowhead: ('empty' if agent.can_control_other_agents?),
|
|
| 144 | 144 |
color: (@disabled if agent.disabled? || receiver.disabled?)) |
| 145 | 145 |
end |
| 146 | 146 |
|
@@ -162,7 +162,7 @@ module DotHelper |
||
| 162 | 162 |
|
| 163 | 163 |
[ |
| 164 | 164 |
*agent.receivers, |
| 165 |
- *(agent.targets if agent.can_run_other_agents?) |
|
| 165 |
+ *(agent.targets if agent.can_control_other_agents?) |
|
| 166 | 166 |
].each { |receiver|
|
| 167 | 167 |
agent_edge(agent, receiver) if agents.include?(receiver) |
| 168 | 168 |
} |
@@ -25,14 +25,14 @@ class Agent < ActiveRecord::Base |
||
| 25 | 25 |
|
| 26 | 26 |
EVENT_RETENTION_SCHEDULES = [["Forever", 0], ["1 day", 1], *([2, 3, 4, 5, 7, 14, 21, 30, 45, 90, 180, 365].map {|n| ["#{n} days", n] })]
|
| 27 | 27 |
|
| 28 |
- attr_accessible :options, :memory, :name, :type, :schedule, :runner_ids, :target_ids, :disabled, :source_ids, :scenario_ids, :keep_events_for, :propagate_immediately |
|
| 28 |
+ attr_accessible :options, :memory, :name, :type, :schedule, :controller_ids, :target_ids, :disabled, :source_ids, :scenario_ids, :keep_events_for, :propagate_immediately |
|
| 29 | 29 |
|
| 30 | 30 |
json_serialize :options, :memory |
| 31 | 31 |
|
| 32 | 32 |
validates_presence_of :name, :user |
| 33 | 33 |
validates_inclusion_of :keep_events_for, :in => EVENT_RETENTION_SCHEDULES.map(&:last) |
| 34 | 34 |
validate :sources_are_owned |
| 35 |
- validate :runners_are_owned |
|
| 35 |
+ validate :controllers_are_owned |
|
| 36 | 36 |
validate :targets_are_owned |
| 37 | 37 |
validate :scenarios_are_owned |
| 38 | 38 |
validate :validate_schedule |
@@ -54,10 +54,10 @@ class Agent < ActiveRecord::Base |
||
| 54 | 54 |
has_many :links_as_receiver, :dependent => :delete_all, :foreign_key => "receiver_id", :class_name => "Link", :inverse_of => :receiver |
| 55 | 55 |
has_many :sources, :through => :links_as_receiver, :class_name => "Agent", :inverse_of => :receivers |
| 56 | 56 |
has_many :receivers, :through => :links_as_source, :class_name => "Agent", :inverse_of => :sources |
| 57 |
- has_many :chains_as_runner, dependent: :delete_all, foreign_key: 'runner_id', class_name: 'Chain', inverse_of: :runner |
|
| 57 |
+ has_many :chains_as_controller, dependent: :delete_all, foreign_key: 'controller_id', class_name: 'Chain', inverse_of: :controller |
|
| 58 | 58 |
has_many :chains_as_target, dependent: :delete_all, foreign_key: 'target_id', class_name: 'Chain', inverse_of: :target |
| 59 |
- has_many :runners, through: :chains_as_target, class_name: "Agent", inverse_of: :targets |
|
| 60 |
- has_many :targets, through: :chains_as_runner, class_name: "Agent", inverse_of: :runners |
|
| 59 |
+ has_many :controllers, through: :chains_as_target, class_name: "Agent", inverse_of: :targets |
|
| 60 |
+ has_many :targets, through: :chains_as_controller, class_name: "Agent", inverse_of: :controllers |
|
| 61 | 61 |
has_many :scenario_memberships, :dependent => :destroy, :inverse_of => :agent |
| 62 | 62 |
has_many :scenarios, :through => :scenario_memberships, :inverse_of => :agents |
| 63 | 63 |
|
@@ -182,8 +182,8 @@ class Agent < ActiveRecord::Base |
||
| 182 | 182 |
!cannot_create_events? |
| 183 | 183 |
end |
| 184 | 184 |
|
| 185 |
- def can_run_other_agents? |
|
| 186 |
- self.class.can_run_other_agents? |
|
| 185 |
+ def can_control_other_agents? |
|
| 186 |
+ self.class.can_control_other_agents? |
|
| 187 | 187 |
end |
| 188 | 188 |
|
| 189 | 189 |
def log(message, options = {})
|
@@ -228,8 +228,8 @@ class Agent < ActiveRecord::Base |
||
| 228 | 228 |
errors.add(:sources, "must be owned by you") unless sources.all? {|s| s.user == user }
|
| 229 | 229 |
end |
| 230 | 230 |
|
| 231 |
- def runners_are_owned |
|
| 232 |
- errors.add(:runners, "must be owned by you") unless runners.all? {|s| s.user == user }
|
|
| 231 |
+ def controllers_are_owned |
|
| 232 |
+ errors.add(:controllers, "must be owned by you") unless controllers.all? {|s| s.user == user }
|
|
| 233 | 233 |
end |
| 234 | 234 |
|
| 235 | 235 |
def targets_are_owned |
@@ -267,7 +267,7 @@ class Agent < ActiveRecord::Base |
||
| 267 | 267 |
|
| 268 | 268 |
class << self |
| 269 | 269 |
def build_clone(original) |
| 270 |
- new(original.slice(:type, :options, :schedule, :runner_ids, :source_ids, :keep_events_for, :propagate_immediately)) { |clone|
|
|
| 270 |
+ new(original.slice(:type, :options, :schedule, :controller_ids, :source_ids, :keep_events_for, :propagate_immediately)) { |clone|
|
|
| 271 | 271 |
# Give it a unique name |
| 272 | 272 |
2.upto(count) do |i| |
| 273 | 273 |
name = '%s (%d)' % [original.name, i] |
@@ -308,12 +308,8 @@ class Agent < ActiveRecord::Base |
||
| 308 | 308 |
!!@cannot_receive_events |
| 309 | 309 |
end |
| 310 | 310 |
|
| 311 |
- def can_run_other_agents! |
|
| 312 |
- @can_run_other_agents = true |
|
| 313 |
- end |
|
| 314 |
- |
|
| 315 |
- def can_run_other_agents? |
|
| 316 |
- @can_run_other_agents |
|
| 311 |
+ def can_control_other_agents? |
|
| 312 |
+ include? AgentControllerConcern |
|
| 317 | 313 |
end |
| 318 | 314 |
|
| 319 | 315 |
# Find all Agents that have received Events since the last execution of this method. Update those Agents with |
@@ -425,7 +421,7 @@ class AgentDrop |
||
| 425 | 421 |
:sources, |
| 426 | 422 |
:receivers, |
| 427 | 423 |
:schedule, |
| 428 |
- :runners, |
|
| 424 |
+ :controllers, |
|
| 429 | 425 |
:targets, |
| 430 | 426 |
:disabled, |
| 431 | 427 |
:keep_events_for, |
@@ -2,10 +2,11 @@ require 'rufus-scheduler' |
||
| 2 | 2 |
|
| 3 | 3 |
module Agents |
| 4 | 4 |
class SchedulerAgent < Agent |
| 5 |
+ include AgentControllerConcern |
|
| 6 |
+ |
|
| 5 | 7 |
cannot_be_scheduled! |
| 6 | 8 |
cannot_receive_events! |
| 7 | 9 |
cannot_create_events! |
| 8 |
- can_run_other_agents! |
|
| 9 | 10 |
|
| 10 | 11 |
description <<-MD |
| 11 | 12 |
This agent periodically triggers a run of each target Agent according to a user-defined schedule. |
@@ -37,7 +38,9 @@ module Agents |
||
| 37 | 38 |
MD |
| 38 | 39 |
|
| 39 | 40 |
def default_options |
| 40 |
- { 'schedule' => '0 * * * *' }
|
|
| 41 |
+ super.update({
|
|
| 42 |
+ 'schedule' => '0 * * * *', |
|
| 43 |
+ }) |
|
| 41 | 44 |
end |
| 42 | 45 |
|
| 43 | 46 |
def working? |
@@ -45,10 +48,7 @@ module Agents |
||
| 45 | 48 |
end |
| 46 | 49 |
|
| 47 | 50 |
def check! |
| 48 |
- targets.active.each { |target|
|
|
| 49 |
- log "Agent run queued for '#{target.name}'"
|
|
| 50 |
- Agent.async_check(target.id) |
|
| 51 |
- } |
|
| 51 |
+ control_targets! |
|
| 52 | 52 |
end |
| 53 | 53 |
|
| 54 | 54 |
def validate_options |
@@ -1,7 +1,7 @@ |
||
| 1 |
-# A Chain connects Agents in a run chain from the `runner` to the `target`. |
|
| 1 |
+# A Chain connects Agents in a run chain from the `controller` to the `target`. |
|
| 2 | 2 |
class Chain < ActiveRecord::Base |
| 3 |
- attr_accessible :runner_id, :target_id |
|
| 3 |
+ attr_accessible :controller_id, :target_id |
|
| 4 | 4 |
|
| 5 |
- belongs_to :runner, class_name: 'Agent', inverse_of: :chains_as_runner |
|
| 5 |
+ belongs_to :controller, class_name: 'Agent', inverse_of: :chains_as_controller |
|
| 6 | 6 |
belongs_to :target, class_name: 'Agent', inverse_of: :chains_as_target |
| 7 | 7 |
end |
@@ -43,26 +43,26 @@ |
||
| 43 | 43 |
<div class="schedule-region" data-can-be-scheduled="<%= @agent.can_be_scheduled? %>"> |
| 44 | 44 |
<div class="can-be-scheduled"> |
| 45 | 45 |
<div class="form-group"> |
| 46 |
- <%= f.label :runners %> |
|
| 47 |
- <span class="glyphicon glyphicon-question-sign hover-help" data-content="Other than the system-defined schedule above, this agent may be run by user-defined ScheduleAgents."></span> |
|
| 48 |
- <% eventRunners = current_user.agents.select(&:can_run_other_agents?) %> |
|
| 49 |
- <%= f.select(:runner_ids, |
|
| 50 |
- options_for_select(eventRunners.map {|s| [s.name, s.id] },
|
|
| 51 |
- @agent.runner_ids), |
|
| 52 |
- {}, { multiple: true, size: 5, class: 'select2 form-control' }) %>
|
|
| 46 |
+ <%= f.label :controllers %> |
|
| 47 |
+ <span class="glyphicon glyphicon-question-sign hover-help" data-content="Other than the system-defined schedule above, this agent may be run by user-defined Agents."></span> |
|
| 48 |
+ <% eventControllers = current_user.agents.select(&:can_control_other_agents?) %> |
|
| 49 |
+ <%= f.select(:controller_ids, |
|
| 50 |
+ options_for_select(eventControllers.map {|s| [s.name, s.id] },
|
|
| 51 |
+ @agent.controller_ids), |
|
| 52 |
+ {}, { multiple: true, size: 5, class: 'select2 form-control' }) %>
|
|
| 53 | 53 |
</div> |
| 54 | 54 |
</div> |
| 55 | 55 |
</div> |
| 56 | 56 |
|
| 57 |
- <div class="chain-region" data-can-run-other-agents="<%= @agent.can_run_other_agents? %>"> |
|
| 58 |
- <div class="can-run-other-agents"> |
|
| 57 |
+ <div class="chain-region" data-can-control-other-agents="<%= @agent.can_control_other_agents? %>"> |
|
| 58 |
+ <div class="can-control-other-agents"> |
|
| 59 | 59 |
<div class="form-group"> |
| 60 | 60 |
<%= f.label :targets %> |
| 61 | 61 |
<% eventTargets = current_user.agents.select(&:can_be_scheduled?) %> |
| 62 | 62 |
<%= f.select(:target_ids, |
| 63 |
- options_for_select(eventTargets.map {|s| [s.name, s.id] },
|
|
| 64 |
- @agent.target_ids), |
|
| 65 |
- {}, { multiple: true, size: 5, class: 'select2 form-control' }) %>
|
|
| 63 |
+ options_for_select(eventTargets.map {|s| [s.name, s.id] },
|
|
| 64 |
+ @agent.target_ids), |
|
| 65 |
+ {}, { multiple: true, size: 5, class: 'select2 form-control' }) %>
|
|
| 66 | 66 |
</div> |
| 67 | 67 |
</div> |
| 68 | 68 |
</div> |
@@ -134,7 +134,7 @@ |
||
| 134 | 134 |
</p> |
| 135 | 135 |
<% end %> |
| 136 | 136 |
|
| 137 |
- <% if @agent.can_run_other_agents? %> |
|
| 137 |
+ <% if @agent.can_control_other_agents? %> |
|
| 138 | 138 |
<p> |
| 139 | 139 |
<b>Targets:</b> |
| 140 | 140 |
<% if (agents = @agent.targets).length > 0 %> |
@@ -0,0 +1,5 @@ |
||
| 1 |
+class RenameRunnerToController < ActiveRecord::Migration |
|
| 2 |
+ def change |
|
| 3 |
+ rename_column :chains, :runner_id, :controller_id |
|
| 4 |
+ end |
|
| 5 |
+end |
@@ -11,7 +11,7 @@ |
||
| 11 | 11 |
# |
| 12 | 12 |
# It's strongly recommended that you check this file into your version control system. |
| 13 | 13 |
|
| 14 |
-ActiveRecord::Schema.define(version: 20140821115428) do |
|
| 14 |
+ActiveRecord::Schema.define(version: 20140822085519) do |
|
| 15 | 15 |
|
| 16 | 16 |
create_table "agent_logs", force: true do |t| |
| 17 | 17 |
t.integer "agent_id", null: false |
@@ -51,13 +51,13 @@ ActiveRecord::Schema.define(version: 20140821115428) do |
||
| 51 | 51 |
add_index "agents", ["user_id", "created_at"], name: "index_agents_on_user_id_and_created_at", using: :btree |
| 52 | 52 |
|
| 53 | 53 |
create_table "chains", force: true do |t| |
| 54 |
- t.integer "runner_id" |
|
| 54 |
+ t.integer "controller_id" |
|
| 55 | 55 |
t.integer "target_id" |
| 56 | 56 |
t.datetime "created_at" |
| 57 | 57 |
t.datetime "updated_at" |
| 58 | 58 |
end |
| 59 | 59 |
|
| 60 |
- add_index "chains", ["runner_id", "target_id"], name: "index_chains_on_runner_id_and_target_id", unique: true, using: :btree |
|
| 60 |
+ add_index "chains", ["controller_id", "target_id"], name: "index_chains_on_controller_id_and_target_id", unique: true, using: :btree |
|
| 61 | 61 |
add_index "chains", ["target_id"], name: "index_chains_on_target_id", using: :btree |
| 62 | 62 |
|
| 63 | 63 |
create_table "delayed_jobs", force: true do |t| |
@@ -497,15 +497,15 @@ describe Agent do |
||
| 497 | 497 |
agent.should have(0).errors_on(:sources) |
| 498 | 498 |
end |
| 499 | 499 |
|
| 500 |
- it "should not allow runner agents owned by other people" do |
|
| 500 |
+ it "should not allow controller agents owned by other people" do |
|
| 501 | 501 |
agent = Agents::SomethingSource.new(:name => "something") |
| 502 | 502 |
agent.user = users(:bob) |
| 503 |
- agent.runner_ids = [agents(:bob_weather_agent).id] |
|
| 504 |
- agent.should have(0).errors_on(:runners) |
|
| 505 |
- agent.runner_ids = [agents(:jane_weather_agent).id] |
|
| 506 |
- agent.should have(1).errors_on(:runners) |
|
| 503 |
+ agent.controller_ids = [agents(:bob_weather_agent).id] |
|
| 504 |
+ agent.should have(0).errors_on(:controllers) |
|
| 505 |
+ agent.controller_ids = [agents(:jane_weather_agent).id] |
|
| 506 |
+ agent.should have(1).errors_on(:controllers) |
|
| 507 | 507 |
agent.user = users(:jane) |
| 508 |
- agent.should have(0).errors_on(:runners) |
|
| 508 |
+ agent.should have(0).errors_on(:controllers) |
|
| 509 | 509 |
end |
| 510 | 510 |
|
| 511 | 511 |
it "should not allow target agents owned by other people" do |